package com.mask.im.server.listener;

import com.mask.im.sdk.annotation.RedisMsgListener;
import com.mask.im.sdk.dto.IMPushMessage;
import com.mask.im.server.service.ServiceIdManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * 注解监听器使用示例
 * 
 * 注意：RedisMsgListenerProcessor会自动查找ServiceIdManager并设置动态节点ID获取器
 * 无需手动设置，直接使用 @RedisMsgListener(nodeId = "CURRENT_NODE") 即可
 * 
 * @author jian
 */
//@Component
public class AnnotationListenerExample {

    @Autowired
    private ServiceIdManager serviceIdManager;

    @PostConstruct
    public void init() {
        // 打印调试信息（可选）
        String currentNodeId = serviceIdManager.getNodeId();
        System.err.println("=== 监听器初始化 ===");
        System.err.println("当前节点ID: " + currentNodeId);
        System.err.println("期望监听的队列: im:msg:queue:" + currentNodeId);
        System.err.println("========================");
        // 注意：RedisMsgListenerProcessor会自动配置动态节点ID获取器，无需手动设置
    }

    /**
     * 处理好友消息 - 使用动态节点ID
     * 自动监听当前节点的队列（节点ID由ServiceIdManager动态获取）
     * 
     * 使用方式：
     * 1. nodeId = "CURRENT_NODE" - 自动使用当前节点的ID（推荐）
     * 2. nodeId = "具体节点ID" - 监听指定节点的队列
     * 3. queue = "队列名" - 监听指定队列名称
     * 
     * 验证消息是否推送到正确节点：
     * 1. 查看日志中的【消息推送】和【收到消息】日志，对比节点ID是否一致
     * 2. 日志格式：
     *    - 【消息推送】发送者: X, 接收者: Y, 目标节点: nodeId, 队列: im:msg:queue:nodeId
     *    - 【收到消息】队列: im:msg:queue:nodeId, 节点ID: nodeId, 发送者: X, 接收者: Y
     * 3. 如果节点ID不匹配，会看到【节点不匹配警告】日志
     */
    @RedisMsgListener(nodeId = "CURRENT_NODE", messageTypes = "FRIEND")
    public void handleFriendMessage(IMPushMessage<Object> message) {
        String currentNodeId = serviceIdManager.getNodeId();
        System.err.println("========================================");
        System.err.println("【好友消息处理器】");
        System.err.println("当前节点ID: " + currentNodeId);
        System.err.println("发送者: " + message.getSenderId());
        System.err.println("接收者: " + message.getReceiverId());
        System.err.println("消息内容: " + message.getContent());
        System.err.println("消息类型: " + message.getPushType());
        System.err.println("========================================");
        // 验证：消息应该推送到当前节点，如果节点ID不匹配，监听器会记录警告日志
    }
    
    /**
     * 处理群组消息 - 使用动态节点ID
     * 
     * 验证方式同上，查看日志中的节点ID是否匹配
     */
    @RedisMsgListener(nodeId = "CURRENT_NODE", messageTypes = "GROUP")
    public void handleGroupMessage(IMPushMessage<Object> message) {
        String currentNodeId = serviceIdManager.getNodeId();
        System.err.println("========================================");
        System.err.println("【群组消息处理器】");
        System.err.println("当前节点ID: " + currentNodeId);
        System.err.println("发送者: " + message.getSenderId());
        System.err.println("群组ID: " + message.getGroupId());
        System.err.println("接收者列表: " + message.getReceiversId());
        System.err.println("消息内容: " + message.getContent());
        System.err.println("========================================");
    }
}
